<?php
/**
 * @author Vitaly
 * Date: 27.04.12
 */

/*
 * Служит прослойкой между моделью сообщения и работой с DbService
 */

class MessageMapper
{
    private $connection; // хранит ссылку на singleton экземпляр DbServide

    function __construct()
    {
        $this->connection = DbService::instance();
    }

    // выполняет добавление сообщения из модели в БД
    // возвращает id комментария

    function add(MessageModel $message)
    {
        $messagedata = array(
            'author' => $message->getAuthor(),
            'text'   => $message->getText(),
            'video'  => $message->getVideo()
        );
        $message->setId($this->connection->insert('messages', $messagedata));
        return $message->getId();
    }

    // возвращает массив всех сообщений с их данными

    function select($leftLimit = null, $rightLimit = null)
    {
        return $this->connection->fetchAssoc($this->connection->select('messages', null, true, $leftLimit, $rightLimit));
    }

    // выполняет поиск сообщения по id
    // возвращает модель сообщения или false

    function find($id)
    {
        $result = $this->connection->fetchAssocOnce($this->connection->select('messages', 'id=' . $id));
        if(!empty($result))
        {
            $message = new MessageModel();

            $message->setAuthor($result['author'])
                    ->setTime($result['time'])
                    ->setText($result['text'])
                    ->setVideo($result['video']);

            return $message;
        }
        else
            return false;
    }

    // выполняет обновление сообщения по его модели
    // идентификация сообщения в БД происходит по id из модели

    function update(MessageModel $message)
    {
        $this->connection->update("messages",
                                  "`text` = '" . $message->getText() . "'," . "`time` = NOW()",
                                  "id=" . $message->getId()
        );
    }

    // выполняет удаление сообщения по id $id

    function delete($id)
    {
        $this->connection->delete("messages","`id`='" . $id . "'");
        $this->connection->delete("comments","`message`='" . $id . "'");
        $this->connection->delete("message_tag_rel", "`message`='" . $id . "'");
    }

    // проверяет доступ юзера к действиям над сообщением
    // сверяет id автора сообщения и id текущего (авторизованного) пользователя

    function checkAccess($msgid)//принимает id автора сообщения
    {
        $message = $this->find($msgid);
        return ($_SESSION['userid'] == $message->getAuthor());
    }

    // возвращает массив всех сообщений, соответствующих тегу с id $tagId

    function getMessagesByTag($tagId)
    {
        return $this->connection->fetchAssoc($this->connection->extSelect("*", "message_tag_rel`, `messages", "WHERE `message_tag_rel`.`message` = `messages`.`id` AND `tag` = " . $tagId . " ORDER BY `messages`.`time` DESC"));
    }

    // возвращиет массив всех сообщений, опубликованных автором с id $authorId

    function getMessagesByAuthor($authorId, $leftLimit, $rightLimit)
    {
        return $this->connection->fetchAssoc($this->connection->select('messages', 'author = ' . $authorId, true, $leftLimit, $rightLimit));
    }

    // преобразует ссылку на видео путем соответствующего iframe
    // возвращает вставку iframe с видео, которое указано по ссылке
    // в случае неверной ссылки возвращает null

    function  prepareVideo($videoLink)
    {
        if(($linkPosition = stripos($videoLink, "youtube.com/watch?v=")) !== false)
        {
            $youtubeLink = substr($videoLink, $linkPosition + 20, 11);
            $videoLink = addslashes("http://www.youtube.com/embed/" . $youtubeLink );
            return $videoLink;
        }
        elseif(($linkPosition = stripos($videoLink, "vimeo.com/")) !== false)
        {
            $vimeoLink = (int)substr($videoLink, $linkPosition + 10, 8);
            $videoLink = addslashes("http://player.vimeo.com/video/" . $vimeoLink);
            return $videoLink;
        }
        else
            return null;
    }
}